package regex;

import org.junit.Test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 非捕获匹配
 *
 * @author zuolonglong
 * @version 1.0
 * @description
 * @date 2022/6/7
 */
public class GroupMatcherTest2 {
    String content = "Windows采用了图形用户界面（GUI），比起从前的MS-DOS需要输入指令使用的方式更为人性化。" +
            "随着计算机硬件和软件的不断升级，Windows也在不断升级，从架构的16位、32位再到64位，" +
            "系统版本从最初的Windows 1.0到大家熟知的Windows 95、Windows 98、Windows Me、Windows 2000、" +
            "Windows XP、Windows Vista、Windows 7、Windows 8、Windows 8.1、Windows 10、Windows 11和Windows Server" +
            "服务器企业级操作系统，微软一直在致力于Windows操作系统的开发和完善";

    /**
     * 非捕获匹配
     *
     * @syntax (?:pattern)
     *
     * 匹配 pattern 但不捕获改匹配的子表达式，即它是一个非捕获匹配，不存储供以后使用的匹配。这对于用“or”字符（|）组合模式的情况很有用。
     * 例如： industr(?:y|ies) 是比 industry|industryies 更经济的表达式
     */
    @Test
    public void test1() {
        // 非命名捕获分组
        Pattern pattern = Pattern.compile("Windows (?:95|98|2000)");
        Matcher matcher = pattern.matcher(content);

        while (matcher.find()) {
            // matcher.group(0) 得到匹配到的字符串
            System.out.println("找到： " + matcher.group(0));

            // 注意： 这里没有 matcher.group(1) 子分组
            // System.out.println("第1个分组内容： " + matcher.group(1));
        }
    }

    /**
     * 非捕获匹配
     *
     * @syntax (?=pattern)
     *
     * 它是一个非捕获匹配。 例如 "Windows (?=95|98|2000)" 匹配 “Windows 2000” 中的 “Windows ” 但不匹配 “Windows 3.1”中的“Windows ”。
     */
    @Test
    public void test2() {
        // 命名捕获分组
        Pattern pattern = Pattern.compile("Windows (?=95|98|2000)");
        Matcher matcher = pattern.matcher(content);

        while (matcher.find()) {
            // matcher.group(0) 得到匹配到的字符串
            System.out.println("找到： " + matcher.group(0));  // 找到： Windows

            // 注意： 这里没有 matcher.group(1) 子分组
            // System.out.println("第1个分组内容： " + matcher.group(1));
        }
    }

    /**
     * 非捕获匹配
     * @syntax (?!=pattern)
     *
     * 它是一个非捕获匹配。 匹配规则和 (?=pattern) 正好相反。
     * 该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。
     * 例如： "Windows (?!95|98|2000)" 匹配 “Windows 3.1”中的“Windows ” 但不匹配 “Windows 2000” 中的 “Windows ”。
     */
    @Test
    public void test3() {
        // 命名捕获分组
        Pattern pattern = Pattern.compile("Windows (?!95|98|2000)");
        Matcher matcher = pattern.matcher(content);

        while (matcher.find()) {
            // matcher.group(0) 得到匹配到的字符串
            System.out.println("找到： " + matcher.group(0));  // 找到： Windows

            // 注意： 这里没有 matcher.group(1) 子分组
            // System.out.println("第1个分组内容： " + matcher.group(1));
        }

    }
}
